const WebSocket = require('ws');
const { ipcMain } = require('electron');

// 创建WebSocket服务器，绑定端口12011
const wss = new WebSocket.Server({ port: 12011 });

// 存储所有连接的客户端
const clients = new Set();

console.log('WebSocket服务器已启动，端口：12011');

// 处理新的WebSocket连接
wss.on('connection', (ws) => {
    console.log('新客户端连接');
    
    // 将新客户端添加到集合中
    clients.add(ws);
    
    // 监听客户端断开连接
    ws.on('close', () => {
        console.log('客户端断开连接');
        clients.delete(ws);
    });
    
    // 监听客户端错误
    ws.on('error', (error) => {
        console.error('WebSocket客户端错误:', error);
        clients.delete(ws);
    });
    
    // 发送欢迎消息
    ws.send(JSON.stringify({
        type: 'welcome',
        message: '欢迎连接到弹幕WebSocket服务器',
        timestamp: new Date().toISOString()
    }));
});

// 方法1：传入一段文本，将文本转发给每个ws客户端
function broadcastMessage(text) {
    if (!text || typeof text !== 'string') {
        console.error('广播消息失败：文本内容无效');
        return false;
    }
    
    const messageStr = text
    let successCount = 0;
    
    // 遍历所有客户端并发送消息
    clients.forEach((client) => {
        if (client.readyState === WebSocket.OPEN) {
            try {
                client.send(messageStr);
                successCount++;
            } catch (error) {
                console.error('发送消息到客户端失败:', error);
                clients.delete(client);
            }
        } else {
            // 移除已断开的客户端
            clients.delete(client);
        }
    });
    
    //console.log(`消息已广播给 ${successCount} 个客户端: ${text}`);
    return successCount;
}

// 方法2：获取ws客户端数量
function getClientCount() {
    // 清理已断开的连接
    clients.forEach((client) => {
        if (client.readyState !== WebSocket.OPEN) {
            clients.delete(client);
        }
    });
    
    const count = clients.size;
    //console.log(`当前WebSocket客户端数量: ${count}`);
    return count;
}

// 导出方法供其他模块使用
module.exports = {
    broadcastMessage,
    getClientCount,
    wss,
    clients
};

// 如果在Electron环境中，注册IPC处理器
if (typeof ipcMain !== 'undefined') {
    // 处理广播消息的IPC请求
    ipcMain.handle('websocket-broadcast', async (event, text) => {
        try {
            const result = broadcastMessage(text);
            return { success: true, clientCount: result };
        } catch (error) {
            console.error('WebSocket广播错误:', error);
            return { success: false, error: error.message };
        }
    });
    
    // 处理获取客户端数量的IPC请求
    ipcMain.handle('websocket-client-count', async () => {
        try {
            const count = getClientCount();
            return { success: true, count };
        } catch (error) {
            console.error('获取WebSocket客户端数量错误:', error);
            return { success: false, error: error.message };
        }
    });
}

// 优雅关闭处理
process.on('SIGINT', () => {
    console.log('正在关闭WebSocket服务器...');
    wss.close(() => {
        console.log('WebSocket服务器已关闭');
        process.exit(0);
    });
});

// 错误处理
wss.on('error', (error) => {
    console.error('WebSocket服务器错误:', error);
});

console.log('WebSocket服务器模块已加载');